package br.com.livro.javapersistence.relacionamentos.model;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;

import org.hibernate.annotations.CollectionOfElements;
import org.hibernate.annotations.IndexColumn;

import br.com.livro.javapersistence.commons.model.CommonField;

@Entity
public class Produto {

	@Id
	@GeneratedValue
	@Column
	private Long produtoId;

	@Column
	private Long fabricanteId;

	@Column
	private String nomeCientifico;

	@Column
	private String nome;

	@Column(nullable = false, unique = true)
	private String uid;

	@OneToOne(mappedBy = "produto", fetch = FetchType.LAZY)
	private Item item;

	@Embedded
	private CommonField commonField;

	@CollectionOfElements
	@OneToMany(cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE })
	@JoinColumn(name = "precoId")
	@IndexColumn(name = "posicao_preco")
	private List<Preco> precos = new ArrayList<Preco>();

	public Produto() {
	}


	/**
	 * @param uid
	 * @param descricao
	 * @param fabricanteId
	 * @param commonField
	 */
	public Produto(String uid, String descricao, Long fabricanteId ,CommonField commonField) {
		this.uid = uid;
		this.nome = descricao.substring(0,5);
		this.commonField = commonField;
		this.fabricanteId = fabricanteId;
	}

	public Long getFabricanteId() {
		return fabricanteId;
	}

	public void setFabricanteId(Long fabricanteId) {
		this.fabricanteId = fabricanteId;
	}

	public String getNomeCientifico() {
		return nomeCientifico;
	}

	public void setNomeCientifico(String nomeCientifico) {
		this.nomeCientifico = nomeCientifico;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getUid() {
		return uid;
	}

	public void setUid(String uid) {
		this.uid = uid;
	}

	public Item getItem() {
		return item;
	}

	public void setItem(Item item) {
		this.item = item;
	}

	public CommonField getCommonField() {
		return commonField;
	}

	public void setCommonField(CommonField commonField) {
		this.commonField = commonField;
	}

	public List<Preco> getPrecos() {
		return precos;
	}

	public void setPrecos(List<Preco> precos) {
		this.precos = precos;
	}

	public Long getProdutoId() {
		return produtoId;
	}

	public void setProdutoId(Long produtoId) {
		this.produtoId = produtoId;
	}

}
